imquartz: Fallback to slave IM context if no NSEvent exists.
authorTakuro Ashie <ashie@clear-code.com>
Sat, 27 Jul 2013 01:34:39 +0000 (10:34 +0900)
committerJohn Ralls <jralls@ceridwen.us>
Sat, 27 Jul 2013 21:26:22 +0000 (14:26 -0700)
When an application translates a key event and drop its native event
before passing to imquartz, it can't recognize the NSEvent. On this
case imquartz doesn't emit any signals such as "commit" signal so
that the application doesn't insert any text. To avoid no response,
at least imquartz should fallback to slave GtkIMContextSimple.

https://bugzilla.gnome.org/show_bug.cgi?id=694273#c27
(cherry picked from commit c064e188943ad6bd79d8476a0f53e27bfddb4a1f)

modules/input/imquartz.c

index 9788ad371fb4b9d540626cb24508cea56b090e06..61ad914945828023f2e0c774763092309268d142 100644 (file)
@@ -137,9 +137,6 @@ quartz_filter_keypress (GtkIMContext *context,
 
   GTK_NOTE (MISC, g_print ("quartz_filter_keypress\n"));
 
-  if (event->type == GDK_KEY_RELEASE)
-    return FALSE;
-
   if (!qc->client_window)
     return FALSE;
 
@@ -152,10 +149,16 @@ quartz_filter_keypress (GtkIMContext *context,
   GTK_NOTE (MISC, g_print ("client_window: %p, win: %p, nsview: %p\n",
                           qc->client_window, win, nsview));
 
+  NSEvent *nsevent = gdk_quartz_event_get_nsevent ((GdkEvent *)event);
+  if (!nsevent)
+    return gtk_im_context_filter_keypress (qc->slave, event);
+
+  if (event->type == GDK_KEY_RELEASE)
+    return FALSE;
+
   if (event->hardware_keycode == 55)   /* Command */
     return FALSE;
 
-  NSEvent *nsevent = gdk_quartz_event_get_nsevent ((GdkEvent *)event);
   NSEventType etype = [nsevent type];
   if (etype == NSKeyDown)
        [nsview keyDown: nsevent];